home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / ubppmpqs.zip / ppmp2.asm < prev    next >
Assembly Source File  |  1993-04-16  |  9KB  |  591 lines

  1. ;PPMP2.ASM 2.0
  2. ;    MACHINE LANGUAGE SUBROUTINES
  3. ;    FOR PPMPQS
  4. ;    1991/92 by YUJI KIDA
  5. ;
  6. .386P
  7.  
  8. code    segment    use16
  9.     assume cs:code,ds:code
  10.  
  11.  
  12.     INCLUDE    UBP.MAC
  13.     include    ppmp.h
  14.  
  15.     org    100h
  16. start:
  17.     JMP    START0
  18.  
  19.     org    104h
  20. sieveout:
  21.     mov    eax,cr0        ;reset PE bit
  22.     and    eax,07ffffffeh
  23.     mov    cr0,eax
  24.  
  25.     db    0eah        ;jmp far ptr flushrl
  26.     dw    offset flushrl
  27. csegmem    dw    ?
  28.  
  29.     ;now in real mode
  30. flushrl:
  31.     sti
  32.     mov    ax,ss
  33.     mov    ds,ax
  34.     mov    es,ax
  35.     retf
  36.  
  37.  
  38.     align    4
  39. primeadrnow    dd    ?
  40. lastprime    dd    ?
  41.  
  42. lpvindexadr    dd    ?
  43. lpvdataadr    dd    ?
  44.  
  45. pmodecsseg    dw    ?
  46.  
  47. primes        dw    ?
  48.  
  49. P_OFF    DW    ?
  50. P_SEG    DW    ?
  51. Y_OFF    DW    ?
  52. Y_SEG    DW    ?
  53.  
  54. L_OFF    DW    ?
  55. L_SEG    DW    ?
  56.  
  57. X_OFF    DW    ?
  58. X_SEG    DW    ?
  59.  
  60. D_OFF    DW    ?
  61. D_SEG    DW    ?
  62. B_OFF    DW    ?
  63. B_SEG    DW    ?
  64. M_OFF    DW    ?
  65. M_SEG    DW    ?
  66. W_OFF    DW    ?
  67. W_SEG    DW    ?
  68.  
  69. Ew_OFF    DW    ?
  70. Ew_SEG    DW    ?
  71.  
  72. X1_OFF    DW    ?
  73. X1_SEG    DW    ?
  74.  
  75. IniLog    DW    ?
  76. CutLog    DW    ?
  77.  
  78. lpvnow        dw    0
  79. lpvcount    dw    0
  80.  
  81.  
  82. ; ** command branch
  83.  
  84.  
  85. START0:
  86.     MOV_AX    AR0        ;ARRAY[0] is the command
  87.     MOV    BX,offset CMD_TBL
  88.     SHL    AX,1
  89.     ADD    BX,AX
  90.     JMP    CS:[BX]
  91.  
  92. CMD_TBL:
  93.     DW    INITMPQS,SETR1R2,SIEVE,SIEVE_ANS,SETDATA
  94.     DW    DECOMPOSE,INITMPQS2
  95.  
  96. ;
  97. ; * Initialize again
  98. ; command#=6
  99.  
  100. initmpqs2:
  101.     mov    eax,fs:[_primes3A]
  102.     or    eax,eax
  103.     jnz    short initmpqs2B
  104.     mov    ebx,fs:[_primes3B]
  105.     mov    fs:[_primes3A],ebx
  106.     mov    fs:[_primes3B],eax
  107.  
  108. initmpqs2B:
  109. comment %
  110.     mov    ax,fs:[_primes1]
  111.     mov    bx,fs:[_primes2]
  112.     mov    cx,fs:[_primes3A]
  113.     mov    dx,fs:[_primes3B]
  114.     mov    si,fs:[_primes4]
  115.     mov    di,fs:[_primes]
  116. int 3
  117. %
  118.     mov    ecx,fs:[_sieveBsize]
  119.     xor    edx,edx
  120.     mov    eax,fs:[_sievewidth]
  121.     shl    eax,1
  122.     div    ecx
  123.     mov    bx,AR0
  124.     mov    cs:[bx],ax        ;loop time
  125.     mul    ecx
  126.     shr    eax,1
  127.     mov    fs:[_sievewidth],eax
  128.     retf
  129.  
  130.  
  131. ;
  132. ;* test the divisivility of W by PR()
  133. ;
  134. ;COMMAND#=5
  135.  
  136. decompose:
  137.     mov    ax,_memoseg
  138.     mov    es,ax
  139.  
  140.     mov    ax,cs:[w_off]
  141.     mov    es:[_absQR],ax
  142.     mov    ax,cs:[w_seg]
  143.     mov    es:[_absQR+2],ax
  144.  
  145.     cli
  146.  
  147.     mov    eax,cr0        ;set PE bit
  148.     or    eax,1
  149.     mov    cr0,eax
  150.  
  151.     db    0eah        ;goto protect mode
  152.     dw    700h
  153.     dw    offset gdt_code32-gdttbl    ;selector
  154.  
  155.  
  156. ;
  157. ; initialize work area
  158. ;COMMAND#=0
  159.  
  160. ;    V1=work(0,0)
  161. ;    V2=P
  162. ;    V3=Y
  163. ;    V4=L
  164. ;    V5=X
  165. ;    V6=D
  166. ;    V7=B
  167. ;    V8=OF
  168. ;    V9=W#
  169. ;    V10=MP2%(0)
  170.  
  171. ;    AR[1]    NUMBER OF PRIMES \ 2
  172. ;    AR[2]    INITIAL LOG
  173. ;    AR[3]    LIMIT LOG
  174. ;
  175. ;    set AR[1]=0 if memory lacks
  176.  
  177. MEMORY_LACK:
  178.     MOV    BX,AR1
  179.     MOV    WORD PTR CS:[BX],0
  180.     retf
  181.  
  182.  
  183. INITMPQS:
  184.     MOV    BX,V1        ;check work(0,0) segment
  185.     MOV    AX,CS:[BX]
  186.     shr    ax,4
  187.     add    ax,CS:[BX+2]
  188.     cmp    ax,_memoseg
  189.     ja    short memory_lack
  190.  
  191.     MOV    BX,V2        ;set P ADDRESS
  192.     MOV    AX,CS:[BX]
  193.     MOV    CS:[P_OFF],AX
  194.     MOV    AX,CS:[BX+2]
  195.     MOV    CS:[P_SEG],AX
  196.  
  197.     MOV    BX,V3        ;set Y ADDRESS
  198.     MOV    AX,CS:[BX]
  199.     MOV    CS:[Y_OFF],AX
  200.     MOV    AX,CS:[BX+2]
  201.     MOV    CS:[Y_SEG],AX
  202.  
  203.     MOV    BX,V4        ;set L ADDRESS
  204.     MOV    AX,CS:[BX]
  205.     MOV    CS:[L_OFF],AX
  206.     MOV    AX,CS:[BX+2]
  207.     MOV    CS:[L_SEG],AX
  208.  
  209.     MOV    BX,V5        ;set X ADDRESS
  210.     MOV    AX,CS:[BX]
  211.     MOV    CS:[X_OFF],AX
  212.     MOV    AX,CS:[BX+2]
  213.     MOV    CS:[X_SEG],AX
  214.  
  215.     MOV    BX,V6        ;set D ADDRESS
  216.     MOV    AX,CS:[BX]
  217.     MOV    CS:[D_OFF],AX
  218.     MOV    AX,CS:[BX+2]
  219.     MOV    CS:[D_SEG],AX
  220.  
  221.     MOV    BX,V7        ;set B ADDRESS
  222.     MOV    AX,CS:[BX]
  223.     MOV    CS:[B_OFF],AX
  224.     MOV    AX,CS:[BX+2]
  225.     MOV    CS:[B_SEG],AX
  226.  
  227.     MOV    BX,V8        ;set Off ADDRESS
  228.     MOV    AX,CS:[BX]
  229.     MOV    CS:[M_OFF],AX
  230.     MOV    AX,CS:[BX+2]
  231.     MOV    CS:[M_SEG],AX
  232.  
  233.     MOV    BX,V9        ;set W# ADDRESS
  234.     MOV    AX,CS:[BX]
  235.     MOV    CS:[W_OFF],AX
  236.     MOV    AX,CS:[BX+2]
  237.     MOV    CS:[W_SEG],AX
  238.  
  239.     MOV    BX,V10        ;set PMODE segment
  240.     MOV    AX,CS:[BX]
  241.     shr    ax,4
  242.     add    ax,CS:[BX+2]
  243.     sub    ax,ARRAYHEADSEG
  244.     mov    cs:[pmodecsseg],ax
  245.  
  246.     MOV_AX    AR1
  247.     shl    ax,1
  248.     mov    cs:[primes],ax
  249.  
  250.     MOV_AX    AR2
  251.     MOV    CS:[IniLog],AX
  252.  
  253.     MOV_AX    AR3
  254.     MOV    CS:[CutLog],AX
  255.  
  256. init100:
  257.     mov    ax,cs
  258.     mov    ds,ax
  259.     mov    [csegmem],ax
  260.  
  261.     mov    eax,primeadr2+primeunitbytes
  262.     mov    [primeadrnow],eax
  263.     mov    [lastprime],0
  264.  
  265. descriptor    struc
  266.     limit_0_15    dw    0
  267.     base_0_15    dw    0
  268.     base_16_23    db    0
  269.     access        db    0
  270.     gran        db    0
  271.     base_24_31    db    0
  272. descriptor    ends
  273.  
  274. code_seg_access    equ    09ah
  275. data_seg_access    equ    092h
  276.  
  277.     ; make GDT
  278.     ; 32bit code segment in protect mode
  279.  
  280.     mov    ax,[pmodecsseg]
  281.     and    eax,0ffffh
  282.     shl    eax,4
  283.     mov    ebx,eax
  284.     shr    eax,16
  285.     mov    gdt_code32.base_0_15,bx
  286.     mov    gdt_code32.base_16_23,al
  287.  
  288.     ; 16 bit code segment in real mode for return
  289.  
  290.     xor    eax,eax
  291.     mov    ax,cs
  292.     shl    eax,4
  293.     mov    ebx,eax
  294.     shr    eax,16
  295.     mov    gdt_code16.base_0_15,bx
  296.     mov    gdt_code16.base_16_23,al
  297.  
  298.     ; 32 bit data segment : start from 00000
  299.  
  300.     ; store "number of primes" and "inilog" and "cutlog" and "M"
  301.  
  302.     mov    ax,_memoseg
  303.     mov    es,ax
  304.  
  305.     xor    di,di
  306.     mov    cx,80h
  307.     xor    ax,ax
  308.     rep    stosw
  309.  
  310.     movzx    eax,word ptr cs:[primes]
  311.     mov    es:[_primesR],eax
  312.     mov    ecx,primeunitbytes
  313.     mul    ecx
  314.     sub    eax,optionRAM        ;//
  315.     jnb    short init140
  316.     xor    eax,eax
  317. init140:
  318.     add    eax,primeadr
  319.     mov    es:[_sievetopR],eax
  320.  
  321.     mov    ax,cs:[inilog]
  322.     mov    ah,al
  323.     mov    es:[_inilogR],ax
  324.     mov    es:[_inilogR+2],ax
  325.  
  326.     mov    ax,cs:[cutlog]
  327.     mov    es:[_cutlogR],ax
  328.  
  329.     lds    si,dword ptr cs:[M_off]
  330.     mov    di,_sievewidthR
  331.     lodsw
  332.     and    ax,7fffh    ;make positive
  333.     movsw
  334.     cmp    ax,1
  335.     je    short init150
  336.     movsw
  337. init150:
  338.     mov    ebx,200000h    ;memory end
  339.     sub    ebx,es:[_sievetopR]
  340.     mov    eax,es:[_sievewidthR]
  341.     shl    eax,1
  342.     cmp    eax,ebx
  343.     jbe    short initmpqs220
  344.  
  345.     push    eax        ;/*
  346.     xor    edx,edx
  347.     div    ebx
  348.     or    eax,eax
  349.     jz    short initmpqs210
  350.     inc    eax
  351. initmpqs210:
  352.     mov    ebx,eax
  353.     xor    edx,edx
  354.     pop    eax        ;*/
  355.     div    ebx
  356. initmpqs220:
  357.     and    al,0f8h        ;let be multiple of 8
  358.     mov    es:[_sieveBsizeR],eax
  359.     add    eax,es:[_sievetopR]
  360.     mov    es:[_sieveoverR],eax
  361.  
  362.     mov    eax,es:[_sieveBsizeR]
  363.     sub    eax,es:[_sievetopR]
  364.     mov    es:[_sieveConstR],eax
  365.  
  366.     mov    eax,es:[_sieveBsizeR]
  367.     shr    eax,1
  368.     mov    es:[_sieveWsizeR],eax
  369.     shr    eax,1
  370.     mov    es:[_sieveDsizeR],eax
  371.     shr    eax,sieveRepLog-2
  372.     mov    es:[_sieveXsizeR],eax
  373.  
  374.     ; set GDT address at GDTR
  375.  
  376.     mov    ax,cs
  377.     mov    ds,ax
  378.     mov    si,offset gdttbl
  379.     mov    ax,_gdttblseg
  380.     mov    es,ax
  381.     mov    di,0
  382.     mov    cx,10h
  383.     rep    movsw
  384.     
  385.     mov    eax,_gdttbladr
  386.     mov    dword ptr gdtaddr+2,eax
  387.     lgdt    gdtaddr
  388.  
  389.     cli
  390.  
  391.     mov    eax,cr0        ;set PE bit
  392.     or    eax,1        ;
  393.     mov    cr0,eax        ;
  394.     jmp    $+2        ;flush buffer
  395.  
  396.     mov    ax,10h        ;now in protect mode
  397.     mov    fs,ax
  398.     mov    gs,ax
  399.  
  400.     mov    eax,cr0        ;reset PE bit
  401.     and    eax,07ffffffeh    ;
  402.     mov    cr0,eax        ;
  403.     jmp    $+2        ;flush buffer
  404.  
  405.     sti
  406.  
  407.     mov    ax,cs
  408.     mov    ds,ax
  409.     mov    ax,_memoseg
  410.     shr    ax,1
  411.     mov    bx,AR1
  412.     mov    [bx],ax
  413.  
  414.     mov    ax,ss
  415.     mov    ds,ax
  416.     mov    es,ax
  417.  
  418.     retf
  419.  
  420. ;
  421. ; set data for each prime
  422. ;command#=4
  423. setdata:
  424.     mov    edi,cs:[primeadrnow]
  425.  
  426.     lds    si,dword ptr cs:[p_off]
  427.     lodsw
  428.     cmp    ax,1
  429.     ja    short setdata20
  430.     xor    eax,eax
  431.     lodsw
  432.     jmp    short setdata30
  433. setdata20:    
  434.     lodsd
  435.  
  436. setdata30:
  437.     cmp    eax,fs:[_sieveBsize]
  438.     jb    short setdata36
  439.     cmp    edi,primeadr
  440.     jae    short setdata35
  441.     mov    edi,primeadr
  442. setdata35:
  443.     inc    word ptr fs:[_primes4]
  444.     jmp    short setdata39
  445. setdata36:
  446.     cmp    eax,fs:[_sieveWsize]
  447.     jb    short setdata37
  448.     cmp    edi,mainRAMover
  449.     jne    short setdata365
  450.     mov    edi,primeadr
  451.     mov    dx,fs:[_primes3B]
  452.     mov    fs:[_primes3A],dx
  453.     mov    word ptr fs:[_primes3B],0
  454. setdata365:
  455.     inc    word ptr fs:[_primes3B]
  456.     jmp    short setdata39
  457. setdata37:
  458.     cmp    eax,fs:[_sieveDsize]
  459.     jb    short setdata38
  460.     inc    word ptr fs:[_primes2]
  461.     jmp    short setdata39
  462. setdata38:
  463.     cmp    eax,fs:[_sieveXsize]
  464.     jb    short setdata39
  465.     inc    word ptr fs:[_primes1]
  466. setdata39:
  467.     mov    edx,eax
  468.     sub    eax,cs:[lastprime]
  469.     mov    fs:[edi],ax
  470.     mov    cs:[lastprime],edx
  471.  
  472.     lds    si,dword ptr cs:[y_off]
  473.     xor    eax,eax
  474.     lodsw
  475.     cmp    ax,1
  476.     ja    short setdata40
  477.     jb    short setdata50
  478. setdata45:
  479.     lodsw
  480.     jmp    short setdata50
  481. setdata40:    
  482.     lodsd
  483. setdata50:
  484.     mov    fs:[edi+4],eax
  485.  
  486.     lds    si,dword ptr cs:[l_off]
  487.     mov    ax,[si+2]
  488.     mov    fs:[edi+2],ax
  489.  
  490.     add    edi,primeunitbytes
  491. setdata60:
  492.     mov    cs:[primeadrnow],edi
  493.  
  494.     mov    ax,ss
  495.     mov    ds,ax
  496.     retf
  497.  
  498. ;
  499. ; * sieving main
  500. ;   386 protect mode
  501. ; command#=2
  502.  
  503. SIEVE:
  504.     cli
  505.     mov    eax,fs:[_primes1]
  506.     mov    eax,cr0        ;set PE bit
  507.     or    eax,1
  508.     mov    cr0,eax
  509.  
  510.     db    0eah        ;goto protect mode
  511.     dw    280h
  512.     dw    offset gdt_code32-gdttbl    ;selector
  513.  
  514. ;
  515. ; get a sieved result
  516. ;
  517. ; command#=3
  518. ;                    !! not used now !!
  519. SIEVE_ANS:
  520.     retf
  521.  
  522. ;
  523. ; set sieve start adr R1,R2 for each prime
  524. ;
  525. ; command#=1
  526.  
  527. SETR1R2:
  528.     ;set parameter
  529.  
  530.     mov    ax,_memoseg
  531.     mov    es,ax
  532.  
  533.     ;store D by 32bit form
  534.  
  535.     lds    si,dword ptr cs:[D_OFF]
  536.     mov    di,_DR
  537.     lodsw
  538.     and    ax,7fffh
  539.     mov    cx,ax
  540.     mov    eax,3        ;3*32 bits
  541.     stosd
  542.     rep    movsw
  543.     xor    eax,eax
  544.     stosd
  545.     stosd
  546.     stosd
  547.  
  548.     ;s